<?php

// .-----------------------------------------------------------------------------------
// |  Software: [HDPHP framework]
// |   Version: 2013.01
// |      Site: http://www.hdphp.com
// |-----------------------------------------------------------------------------------
// |    Author: 向军 <houdunwangxj@gmail.com>
// | Copyright (c) 2012-2013, http://houdunwang.com. All Rights Reserved.
// |-----------------------------------------------------------------------------------
// |   License: http://www.apache.org/licenses/LICENSE-2.0
// '-----------------------------------------------------------------------------------

/**
 * HDPHP框架入口文件
 * 在单入口引入hdphp.php即可运行框架
 * @package      core
 * @author       后盾向军 <houdunwangxj@gmail.com>
 */
final class HD {

    //HD框架版本
    public static $version = "2013.02.25 beta";
    //是否已经执行框架run方法，用于控制入口文件只执行一次
    private static $_isRun = false;

    /**
     * 运行框架
     * 在单入口文件引入框架hdphp.php文件会自动执行run()方法，所以不用单独执行run方法
     * @access public
     * @return void
     */
    static public function run() {
        if (self::$_isRun) {
            return;
        }
        self::$_isRun = true;
        defined("COMPILE") || define("COMPILE", TRUE);
        //应用名
        if (defined("APP_NAME") && !defined("APP")) {
            define("APP", APP_NAME);
        }
        //是否设置应用组
        define("APP_SET", defined("APP") ? TRUE : FALSE);
        self::Definition(); //配置系统常量
        if (!defined("TEMP_FILE")) {
            define("TEMP_FILE", 'boot');
        }

        //只取文件名
        $bootFile = preg_replace('/.php/i', '', basename(TEMP_FILE));
        define("PATH_TEMP_BOOT", PATH_TEMP . '/' . $bootFile . '.php'); //核心编译文件
        if (COMPILE && is_file(PATH_TEMP_BOOT)) {
            require PATH_TEMP_BOOT; //如果编译文件存在加载核心编译文件boot.php
        } else {
            self::loadCoreFile(); //加载核心文件
        }
       
        App::run(); //运行应用目录下的项目
    }

    /**
     * 设置常量
     * 定义一些核心常量，具体使用请参考HDPHP框架手册
     * @access  private
     */
    static private function Definition() {
        define('NOW', $_SERVER['REQUEST_TIME']);
        define("NOW_MICROTIME", microtime(true));
        define("HD_VERSION", self::$version); //后盾框架版本
        define("IS_WIN", strstr(PHP_OS, 'WIN') ? true : false); //window环境
        define("PATH_HD", str_replace("\\", "/", dirname(__FILE__))); //框架目录
        define("PATH_HD_DATA", PATH_HD . '/data'); //HDPHP框架数据文件夹
        define("PATH_HD_PLUGIN", PATH_HD . '/plugin'); //扩展插件路径
        define("PATH_HD_CORE", PATH_HD . '/libs/core'); //运行文件夹
        define("PATH_HD_CLASS", PATH_HD . '/libs/class'); //框架类库文件夹
        define("PATH_HD_DRIVER", PATH_HD . '/libs/driver'); //框架驱动文件夹
        define("PATH_HD_LANGUAGE", PATH_HD . '/libs/language'); //语言包文件夹
        define("PATH_HD_CONFIG", PATH_HD . '/libs/config'); //配置文件夹
        define("PATH_HD_TPL", PATH_HD . '/libs/tpl'); //模板文件夹
        $root = rtrim(str_replace(array('/', "\\"), "/", dirname($_SERVER['SCRIPT_FILENAME'])), '/');
        define("PATH_ROOT", $root); //网站物理路径
        define("PATH_TEMP", PATH_ROOT . '/temp'); //运行时的临时目录路径
        define("PATH_LOG", PATH_TEMP . '/log'); //日志文件目录路径
        define("PATH_SESSION", PATH_TEMP . '/session'); //保存SESSION文件的目录路径
    }

    /**
     * 加载核心编译文件
     * 如果项目入口文件中定义了define("COMPILE",FALSE)常量，是不会生成核心编译文件的
     * 核心编译文件主要是将框架运行时的文件合并运空白，从而强系统运行性能
     * @access private
     * @return void
     */
    private static function loadCoreFile() {
        is_file(PATH_TEMP_BOOT) && unlink(PATH_TEMP_BOOT); //删除编译文件
        $coreFile = PATH_HD_CORE . '/compileFiles.php'; //需要编译的文件
        $files = require $coreFile; //载入需要编译到compileFiles.phps中的文件列表
        foreach ($files as $v) {
            if (is_file($v))
                require ($v);
        }
        //创建核心目录
        self::mkdirs();
    }

    /**
     * 创建框架运行目录
     * @access public
     * @return void
     */
    static private function mkdirs() {
        if (!is_dir(PATH_TEMP))
            @mkdir(PATH_TEMP, 0755) || die("<div style='padding:20px;border:solid 1px #dcdcdc;width:800px;'><h3>directory:" . PATH_TEMP . "</h3><br/>Failed to create, modify permissions"); //"临时目录创建失败，请修改权限！"
        if (!is_dir(PATH_LOG))
            @mkdir(PATH_LOG, 0755) || die("<div style='padding:20px;border:solid 1px #dcdcdc;width:800px;'><h3>directory:" . PATH_LOG . "</h3><br/>Failed to create, modify permissions"); //"日志目录创建失败，请修改权限！"
        if (!is_dir(PATH_SESSION))
            @mkdir(PATH_SESSION, 0755) || die("<div style='padding:20px;border:solid 1px #dcdcdc;width:800px;'><h3>directory:" . PATH_SESSION . "</h3><br/>Failed to create, modify permissions"); //"SESSION目录目录创建失败，请修改权限！"
        $indexHtml = PATH_HD_TPL . '/index.html';
        is_file(PATH_TEMP . '/index.html') || copy($indexHtml, PATH_TEMP . '/index.html');
        is_file(PATH_LOG . '/index.html') || copy($indexHtml, PATH_LOG . '/index.html');
        is_file(PATH_SESSION . '/index.html') || copy($indexHtml, PATH_SESSION . '/index.html');
    }

}
HD::run();